/*
 * Servidor.cpp
 *
 *  Created on: 26/10/2011
 *      Author: pablo
 */

#include "Servidor.h"
#include "../common/sockets/TCPSocket.h"
#include "../common/sockets/exceptions/SocketException.h"
#include "../common/protocoloControl/ProtocoloControl.h"
#include "../common/protocoloControl/ProtocoloControlException.h"

#include "../servidor/ServidorHttp.h"

#define CANT_MAX_CLI 1

Servidor::Servidor(const Configuracion& c): config(c) {
}

Servidor::~Servidor() {
}

int Servidor::start() {
	TCPSocket sockCrtl;
	int retorno = 0;
	try {
		sockCrtl.bindear(config.getConfiguracionBasica().getPuertoControl());
		sockCrtl.escuchar(CANT_MAX_CLI);
		ServidorHttp servidorHTTP(config);
		servidorHTTP.start();
		std::cout << "SERVIDOR HTML ACTIVADO en puerto:  " << config.getConfiguracionBasica().getPuerto() <<std::endl;
		bool activo = true;
		while(activo) {
			TCPSocket* sockClienteCrtl = sockCrtl.aceptar();
			ProtocoloControl protocoloCtrl(*sockClienteCrtl);
			try {
				activo = protocoloCtrl.recibirOperacionDetener();
				if(!activo) {
					servidorHTTP.morir();
					servidorHTTP.apagar();
					servidorHTTP.join();
					std::cout << "SERVIDOR HTML DESACTIVADO" << std::endl;
				} else {
					std::cout << "SE INGRESO UNA OPERACION INVALIDA" << std::endl;
					// todo: agregar a logs
				}
				protocoloCtrl.enviarRespuestaDetenido(!activo);
			} catch(const ProtocoloControlException&) {
				// ERROR DE CONEXION CON EL CLIENTE log?
			}
			sockClienteCrtl->apagar();
			sockClienteCrtl->cerrar();
			delete sockClienteCrtl;
		}
	} catch(const SocketException&){
		std::cout << "NO SE PUDO INICIAR EL SERVIDOR" << std::endl;
		// todo: log?
		retorno = 1;
	}
	sockCrtl.apagar();
	sockCrtl.cerrar();
	return retorno;
}
